﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using ONG.Componentes.AccesoDatos.Model.TallerArtesanal;
using ONG.Componentes.LogicaNegocio;

namespace ONG.Componentes.ProyectoInformatico.Areas.Supervisor.Controllers
{
    public class MainController : Controller
    {
        //
        // GET: /Supervisor/Main/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Menu()
        {
            return PartialView();
        }
        
        public ActionResult AsignarTaller()
        {
            return PartialView();
        }

        public ActionResult AsignarTallerList(int idOrdenPedido)
        {
            ViewBag.ListadoOP = LNOrdenPedido.ListadoOrdenPedido(1);
            ViewBag.ListadoDetalleOP = LNOrdenPedido.ListadoDetalleOrdenPedido(idOrdenPedido);
            return PartialView();
        }

        public ActionResult AsignarTallerTalleresList(int idDetallePedido)
        {
            ViewBag.ListadoProgramacionTaller = LNOrdenPedido.ListadoProgramacionTallerByIdDetallePedido(idDetallePedido);    
            return PartialView();
        }

        public ActionResult EliminarProgramacionTaller(int idDetallePedid, int idProgramacionTaller)
        {
            bool result = LNOrdenPedido.EliminarProgramacionTaller(idDetallePedid, idProgramacionTaller);
            return RedirectToAction("AsignarTallerTalleresList", new { idDetallePedido = idDetallePedid });
        }

        public ActionResult BuscarOrdenPedido()
        {
            return PartialView();
        }

        public ActionResult BuscarOrdenPedidoList(int? idSupervisor, DateTime? FechaEntregaInicio, DateTime? FechaEntregaFin, string CodOrdenPedido = null, string Asignado = null)
        {
            ViewBag.ListadoOP = LNOrdenPedido.ListadoOrdenPedido(null,FechaEntregaInicio, FechaEntregaFin, CodOrdenPedido, Asignado);
            ViewBag.ListadoComprador = LNOrdenPedido.ListadoComprador();
            return PartialView();
        }

        public ActionResult BuscarTallerDisponible()
        {

            return PartialView();
        }

        public ActionResult BuscarTallerDisponibleList(DateTime? fechaInicio, DateTime? fechaFin)
        {
            ViewBag.ListadoDetalleTD = LNOrdenPedido.ListadoTallerDisponible(fechaInicio, fechaFin);
            return PartialView();
        }


        public ActionResult ActualizarProgramacion()
        {
            return PartialView();
        }

        public ActionResult RegistrarAvanceProduccion()
        {
            return PartialView();
        }

        public ActionResult AgendaVisitas()
        {
            return PartialView();
        }
        
        public ActionResult ActualizarProgramacionList(int idOrdenPedido)
        {
            ViewBag.ListadoProgramacionTaller = LNOrdenPedido.ListadoProgramacionTallerByIdOrdenPedido(idOrdenPedido);
            return PartialView();
        }

        public ActionResult RegistrarAvanceProduccionList(int idOrdenPedido)
        {
            ViewBag.ListadoProgramacionTaller = LNOrdenPedido.ListadoProgramacionTallerByIdOrdenPedido(idOrdenPedido);
            return PartialView();
        }

        public ActionResult ActualizarProgramacionEntregasList(int idProgramacion, int idTaller)
        {
            ViewBag.ListadoEntregas = LNOrdenPedido.ListadoEntregas(idProgramacion, idTaller);
            return PartialView();
        }

        public ActionResult RegistrarAvanceProduccionEntregasList(int idProgramacion, int idTaller)
        {
            ViewBag.ListadoEntregas = LNOrdenPedido.ListadoEntregas(idProgramacion, idTaller);
            return PartialView();
        } 
        
        public ActionResult AgendaVisitasList(DateTime? fechaEntrega)
        {
            ViewBag.ListadoAgendaVisitas = LNOrdenPedido.ListadoAgendaVisitas(fechaEntrega);
            return PartialView();
        }

        [HttpPost]
        public ActionResult ActualizarDatosProgramacion(int Id_Programacion, int Id_Taller, int CantidadEntregas_Programacion = 0)
        {

            bool exito = false;
            //int cantDetPlaAba = false;
            var programacionTaller = LNOrdenPedido.ObtenerProgramacionTaller(Id_Programacion, Id_Taller);
            programacionTaller.CantidadEntregas = CantidadEntregas_Programacion;
            programacionTaller = LNOrdenPedido.ActualizarProgramacionTaller(programacionTaller);
            programacionTaller = LNOrdenPedido.ObtenerProgramacionTaller(programacionTaller.IdProgramacionTaller, (int) programacionTaller.IdTaller);

            if (programacionTaller != null)
            {
                exito = true;
            }

            var js = new JavaScriptSerializer();
            //var result = new[] { exito.ToString(CultureInfo.InvariantCulture) };
            return Content(js.Serialize(exito));

        }
        
        [HttpPost]
        public ActionResult GrabarRegistrarAvanceProduccion(int idEntrega, int cantidadEjecutada)
        {

            bool exito = false;
            var  programacionTaller = LNOrdenPedido.GrabarRegistrarAvanceProduccion(idEntrega, cantidadEjecutada);

            if (programacionTaller != null)
            {
                exito = true;
            }

            var js = new JavaScriptSerializer();
            //var result = new[] { exito.ToString(CultureInfo.InvariantCulture) };
            return Content(js.Serialize(exito));

        }


        public ActionResult MuestraCalendario(int idProgramacion, int idTaller)
        {

            ViewBag.idProgramacion = idProgramacion; //LNOrdenPedido.ObtenerProgramacionTaller(idProgramacion, idTaller).IdProgramacion;
            ViewBag.idTaller = idTaller;
            return View();

        }

        //public JsonResult ObtenerFechasDeProgramacion(double start, double end)

        [AcceptVerbs(HttpVerbs.Get)]
        public JsonResult ObtenerFechasDeProgramacion(int idProgramacion, int idTaller)
        {
            //var startDateTime = FromUnixTimestamp(start);
            //var endDateTime = FromUnixTimestamp(end);
            ////Conexion a la Base de Datos
            ////var events = from reps in context.CalEntries
            ////             where reps.StartDateTime > startDateTime && reps.EndDateTime < endDateTime
            ////             select reps;
            ////List<IN_PROGRAMACION_PROFESOR> listadoSesion = RegistroDatosPostulantePost.ObtenerProgramacionProfesor();

            List<TA_Entrega> listadoEntregas = LNOrdenPedido.ListadoEntregas(idProgramacion, idTaller);
            var clientList = new List<object>();
            foreach (var e in listadoEntregas)
            {
                clientList.Add(new
                {
                    id = e.IdProgramacionTaller,
                    title = e.CantidadProgramada + "Unidades. " + e.TA_ProgramacionTaller.TA_DetalleOrdenPedido.TA_Producto.Descripción + " " + e.TA_ProgramacionTaller.TA_DetalleOrdenPedido.Color,
                    description = e.Entrega1 + " " + e.TA_Taller.RazónSocial + " " + e.TA_ProgramacionTaller.TA_DetalleOrdenPedido.TA_OrdenPedido.CodOrdenPedido,
                    start = ConvertToTimestamp((DateTime) e.FechaEntrega),
                    end = ConvertToTimestamp((DateTime) e.FechaEntrega),
                    allDay = false,
                });
            } return Json(clientList.ToArray(), JsonRequestBehavior.AllowGet);
        }

        private static double ConvertToTimestamp(DateTime value)
        {
            //create Timespan by subtracting the value provided from
            //the Unix Epoch
            TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
            //return the total seconds (which is a UNIX timestamp)
            return (double)span.TotalSeconds;
        } 

        //[AcceptVerbs(HttpVerbs.Post)]
        //public JsonResult GrabarProgramacion(int idProgramacion)
        //{
        //    TA_ProgramacionTaller prog = LNOrdenPedido.GrabarProgramacion(idDetalleOP, idProgramacion); 

        //    if (prog != null)
        //        return Json(prog.IdProgramacionTaller, "text/html", JsonRequestBehavior.AllowGet);
        //    else
        //        return Json(0, "text/html", JsonRequestBehavior.AllowGet);
        //}

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult GrabarAsignacionTaller(int idDetalleOP, int idProgramacion, int idTaller, int cantAsignadas)
        {
            TA_ProgramacionTaller progTaller = LNOrdenPedido.GrabarProgramacionTaller(idDetalleOP, idProgramacion, idTaller, cantAsignadas);

            if (progTaller != null)
                return Json(progTaller.IdProgramacionTaller, "text/html", JsonRequestBehavior.AllowGet);
            else
                return Json(0, "text/html", JsonRequestBehavior.AllowGet);
        }



        public ActionResult GenerarCotizacion()
        {
            return PartialView();
        }

        public ActionResult GenerarCotizacionList(string estadoSolicitud)
        {
            ViewBag.ListadoCotizacion = LNOrdenPedido.ListadoCotizacion(estadoSolicitud);    
            return PartialView();
        }

        public ActionResult GenerarCotizacionProductosList(int idSolicitud)
        {
            ViewBag.ListadoDetalleCotizacionProductos = LNOrdenPedido.ListadoDetalleCotizacionProductos(idSolicitud);    
            return PartialView();
        }
        
        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult AprobarSolicitudCotizacion(int idSolicitud, DateTime fechaEntrega)
        {
            TA_SolicitudCotizacion cotizacion = LNOrdenPedido.AprobarSolicitudCotizacion(idSolicitud, fechaEntrega);

            if (cotizacion != null)
                return Json(cotizacion.IdSolicitud, "text/html", JsonRequestBehavior.AllowGet);
            else
                return Json(0, "text/html", JsonRequestBehavior.AllowGet);
        }
        
        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult RechazarSolicitudCotizacion(int idSolicitud)
        {
            TA_SolicitudCotizacion cotizacion = LNOrdenPedido.RechazarSolicitudCotizacion(idSolicitud);

            if (cotizacion != null)
                return Json(cotizacion.IdSolicitud, "text/html", JsonRequestBehavior.AllowGet);
            else
                return Json(0, "text/html", JsonRequestBehavior.AllowGet);
        }

    }
}
